package com.mini.grpc.retry;

import com.mini.grpc.common.Status;

/**
 * 重试策略接口
 * 定义RPC调用失败时的重试行为
 * 
 * @author Mini-gRPC
 */
public interface RetryPolicy {
    
    /**
     * 判断是否应该重试
     * 
     * @param status 失败状态
     * @param attemptCount 当前尝试次数（从1开始）
     * @return 如果应该重试返回true
     */
    boolean shouldRetry(Status status, int attemptCount);
    
    /**
     * 获取下次重试的延迟时间（毫秒）
     * 
     * @param attemptCount 当前尝试次数（从1开始）
     * @return 延迟时间（毫秒）
     */
    long getRetryDelayMillis(int attemptCount);
    
    /**
     * 获取最大重试次数
     * 
     * @return 最大重试次数
     */
    int getMaxAttempts();
    
    /**
     * 获取策略名称
     * 
     * @return 策略名称
     */
    String getName();
    
    /**
     * 无重试策略
     */
    RetryPolicy NO_RETRY = new RetryPolicy() {
        @Override
        public boolean shouldRetry(Status status, int attemptCount) {
            return false;
        }
        
        @Override
        public long getRetryDelayMillis(int attemptCount) {
            return 0;
        }
        
        @Override
        public int getMaxAttempts() {
            return 1;
        }
        
        @Override
        public String getName() {
            return "no_retry";
        }
    };
} 